// /**
//  * @File:bleota.h
//  * @Version:V1.0
//  * @Author:rudius
//  * @Brief: Bluetooth OTA upgrade interface definitions
//  * @Logs:
//  * 	Date		Author		Notes
//  * 	2025-07-03	rudius		first version
//  */

// #ifndef __BLEOTA_H
// #define __BLEOTA_H
// // <<< Use Configuration Wizard in Context Menu >>>

// /* Includes ------------------------------------------------------------------*/
// #include <stdint.h>
// #include <stddef.h>
// #include "mx01.h"     // 蓝牙转串口API
// #ifdef USER_USING_W25QXX
// #include "w25qxx.h"   // SPI Flash API
// #endif
// #include "ymodem.h"   // Ymodem协议实现
// #include <rtthread.h> // RT-Thread基础

// #ifdef __cplusplus
// extern "C"
// {
// #endif

// /* Public define -------------------------------------------------------------*/
// #define OTA_FLASH_ADDR_DEFAULT 0x00000000
// #define OTA_MAX_FIRMWARE_SIZE (1024 * 512) // 512KB
// #define OTA_BUFFER_SIZE (1024 * 2)         // 2KB

//     /* Public macro --------------------------------------------------------------*/

//     /* Public typedef ------------------------------------------------------------*/
//     typedef enum
//     {
//         OTA_EVENT_START = 0x01,
//         OTA_EVENT_DATA = 0x02,
//         OTA_STATE_FAILED = 0x04,
//         OTA_EVENT_ABORT = 0x08,
//         OTA_STATE_IDLE = 0x10,       // 空闲状态
//         OTA_STATE_RECEIVING = 0x20,  // 接收数据中
//         OTA_STATE_VALIDATING = 0x40, // 校验固件
//         OTA_STATE_READY = 0x80,      // 准备升级
//     } ota_state_t;

//     typedef enum
//     {
//         OTA_SOURCE_BLE,
//         OTA_SOURCE_CLI
//     } ota_source_t;

//     typedef struct
//     {
//         uint32_t size;
//         uint32_t crc32;
//         uint32_t version;
//         uint32_t timestamp;
//         uint8_t md5[16];
//     } ota_metadata_t;

//     typedef struct
//     {
//         uint32_t flash_base_addr;
//         uint32_t flash_max_size;
//         uint32_t buffer_size;
//         uint8_t auto_reboot : 1;
//         uint8_t verify_crc : 1;
//         uint8_t verify_md5 : 1;
//     } ota_config_t;

//     typedef struct
//     {
//         ota_state_t state;
//         ota_source_t source;
//         ota_config_t config;
//         ota_metadata_t metadata;
//         struct mx01_device *ble_dev;
//         #ifdef USER_USING_W25QXX
//         w25qxx_device_t *flash_dev;
//         #endif
//         uint32_t bytes_received;
//         uint32_t bytes_written;
//         uint32_t current_offset;
//         rt_mutex_t lock;
//         rt_sem_t data_ready;
//         rt_thread_t worker_thread;
//     } ota_context_t;

//     /**
//      * @brief Ymodem协议事件类型定义
//      */
//     typedef enum
//     {
//         YMODEM_EVENT_START,           /**< 传输开始事件 */
//         YMODEM_EVENT_HEADER,          /**< 文件头接收完成事件 */
//         YMODEM_EVENT_DATA,            /**< 数据包接收事件 */
//         YMODEM_EVENT_END,             /**< 传输正常结束事件 */
//         YMODEM_EVENT_ABORT,           /**< 传输中止事件 */
//         YMODEM_EVENT_ERROR,           /**< 协议错误事件 */
//         YMODEM_EVENT_NAK,             /**< NAK请求重传事件 */
//         YMODEM_EVENT_PACKET_COMPLETE, /**< 完整数据包接收事件 */
//         YMODEM_EVENT_FILENAME,        /**< 文件名接收事件 */
//         YMODEM_EVENT_FILESIZE,        /**< 文件大小接收事件 */
//         YMODEM_EVENT_TIMEOUT          /**< 传输超时事件 */
//     } ymodem_event_t;
//     /* Public variables ----------------------------------------------------------*/

//     /* Public function prototypes ------------------------------------------------*/
//     int ota_init(const ota_config_t *config);
//     int ota_start(ota_source_t source);
//     void ota_abort(void);
//     ota_state_t ota_get_state(void);
//     uint8_t ota_get_progress(void);
//     void ota_perform_upgrade(void);

//     void ota_ble_data_callback(struct mx01_device *dev,
//                                const uint8_t *buffer,
//                                rt_size_t size,
//                                void *context);

//     void ota_ymodem_callback(ymodem_event_t event,
//                              const void *data,
//                              size_t size,
//                              void *context);

// rt_weak enum rym_code ota_rym_begin_cb(struct rym_ctx *ctx, rt_uint8_t *buf, rt_size_t len);
// rt_weak enum rym_code ota_rym_data_cb(struct rym_ctx *ctx, rt_uint8_t *buf, rt_size_t len);
// rt_weak enum rym_code ota_rym_end_cb(struct rym_ctx *ctx, rt_uint8_t *buf, rt_size_t len);

// #ifdef RT_USING_FINSH
//     void ota_start_cli(void);
//     void ota_status_cli(void);
//     void ota_abort_cli(void);
// #endif

// #ifdef __cplusplus
// }
// #endif

// // <<< end of configuration section >>>
// #endif
// /*------------------------------end of bleota.h---------------------------------*/